package javabook.ch06;

/*
 * 추상 클래스
	하위 클래스에서 구현될 추상적인 기능만을 추상 메소드로 선언
	추상 메소드는 기능이 무엇(What)인지만을 선언하고 구현부분이 없는 메소드이다
	추상 메소드는 하위 클래스에서 오버라이딩되어 구현된다
	추상 클래스는 추상 메소드 외에 일반적인 속성과 메소드를 가질 수 있다. 

	abstract class 클래스이름  {
	  ……..// 일반 속성과 메소드 기술
	  abstract void 추상메소드이름();  // 추상 메소드 선언
	  ……..
	}
		
 */

	abstract class Shape {   // 추상클래스 선언
	  abstract void draw();  // 구현부분이 없는 추상 메소드 정의
	}
	class Circle extends Shape {
	  void draw() {
	    System.out.println("원을 그리는 기능");
	  }}
	class Rectangle extends Shape {
	  void draw() {
	    System.out.println("사각형을 그리는 기능");
	  }}
	class Triangle extends Shape {
	  void draw() {
	    System.out.println("삼각형을 그리는 기능");
	  }}
	class AbstractClass {
	  public static void main(String args[]) {
		  
	    Circle c = new Circle();	    c.draw();
	    Rectangle r = new Rectangle();	    r.draw();
	    Triangle t = new Triangle();	    t.draw();
	    
	    System.out.println("====객체 형변환과 오버라이딩을 이용====");
	    
	    Shape s = new Circle();    // 상위 클래스의 객체에 하위 클래스의 객체를 형변환
	    s.draw();                  // draw() 메소드 호출
	    s = new Rectangle();
	    s.draw();                  // draw() 메소드 호출 
	    s = new Triangle();
	    s.draw();                  // draw() 메소드 호출
	  }
	}
